# -*- coding = utf-8 -*-
# @Time : 2020/8/3 20:57
# @Author : 姚远
# @File : testBS4.py
# @Software: PyCharm
import bs4

'''
BeautifulSoup4将复杂HTML文档转换成一个复杂的树形结构，每个节点都是python对象，所有对象可以归纳为四种

-Tag
-NavigableString
-BeautifulSoup
-Comment
'''
f = open("./baidu.html", "rb")
html = f.read()
bs = bs4.BeautifulSoup(html, "html.parser")
# 1.Tag标签及其内容：拿到它所找到的第一个内容
print(bs.title)
print(bs.a)
# 2.NavigableString标签里的内容（字符串）
print(bs.title.string)
print(bs.a.attrs)  # 获取标签里面的属性，返回字典
# 3.BeautifulSoup表示整个文档
print(bs)
# 4.Comment一个特殊的NavigableString，输出的内容不包括注射符号
print(bs.a.string)

# ---------------------应用-------------------------

# 文档的遍历
print(bs.head.contents)
print(bs.head.contents[1])

# 文档的搜索
# （1）find_all():字符串过滤，会查找与字符串完全匹配的内容
for item in bs.find_all("a"):
    print(item)

import re

# 正则表达式搜索，使用search（）方法来匹配内容
print("正则表达式")
for item in bs.find_all(re.compile("a")):
    print(item)

# 方法：定义一个方法（函数），根据函数的要求来搜索
print("方法")


def name_is_exists(tag):
    print(tag)
    print(tag.has_attr("name"))
    return tag.has_attr("name")


for item in bs.find_all(name_is_exists):
    print(item)
print(type(bs.find()))

# 2.kwargs      参数
print("2.kwargs      参数")
for item in bs.find_all(id='head'):
    print(item)
for item in bs.find_all(class_=True):
    print(item)

# 3.text     参数
print("3.text     参数")
for item in bs.find_all(text=["地图", "贴吧"]):
    print(item)
for item in bs.find_all(text=re.compile(r"\d")):
    print(item)

# 4.limit       参数
print("4.limit       参数")
for item in bs.find_all("a", limit=3):
    print(item)

# css选择器
print("css选择器")
for item in bs.select("title"):     # 通过标签寻找
    print(item)
for item in bs.select(".mnav"):     # 通过类名来查找
    print(item)
for item in bs.select("#u1"):     # 通过id来查找
    print(item)
for item in bs.select("a[name='tj_trvideo']"):     # 通过属性来查找
    print(item)
for item in bs.select("head > title"):     # 通过子标签来查找
    print(item)
for item in bs.select(".mnav ~ .bri"):     # 通过兄弟标签来查找
    print(item.get_text())